﻿Imports WSEntidades
Imports Utilerias
Imports WSDatos

Public Class EmpresasBL

    Public Function ActualizaDatosFiscales(ByVal TokenConexion As String, ByVal Empresa As empresaBE,
                                           ByRef detResp As DetalleRespuesta) As Boolean
        detResp.Mensajes = ""
        Dim boolExisteEmpresa As Boolean = True
        Dim cuentaBL As CuentasBL = New CuentasBL()
        Dim empresaDal As EmpresaDAL = New EmpresaDAL("")
        Dim cuentas As CuentasBL = New CuentasBL()
        Try
            TokenConexion = RijndaelSimple.desencriptaDefault(TokenConexion)
            If (EsValidoParaActualizar(Empresa, detResp.Mensajes)) Then
                empresaDal = New EmpresaDAL(TokenConexion)
                If (empresaDal.actualizaDatosFiscales(Empresa)) Then
                    cuentas.ActualizaDatosEmpresa(Empresa, detResp.Mensajes)
                    'Almacenar logo en sistema de archivos
                    If (Empresa.Logo IsNot Nothing) Then
                        If (Not System.IO.Directory.Exists(System.IO.Path.Combine(My.Settings.PathFiles, Empresa.RFC))) Then
                            System.IO.Directory.CreateDirectory(System.IO.Path.Combine(My.Settings.PathFiles, Empresa.RFC))
                        End If
                        If (csArchivos.escribeArchivoDesdeBytearray(System.IO.Path.Combine(My.Settings.PathFiles, Empresa.RFC),
                                                                "logo.jpg",
                                                                Empresa.Logo) = "") Then
                            detResp.Mensajes &= "Error al almacenar imagen de logo." & vbCrLf
                        End If
                    End If
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK,
                                             "Datos Fiscales Actualizados." & vbCrLf & detResp.Mensajes)
                    Return True
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_NoFueActualizado,
                                                 "No se pudo realizar la actualización de Datos Fiscales.")
                    Return False
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "La informacion no es valida para actualizar: " & vbCrLf & detResp.Mensajes)
                Return False
            End If
        Catch ex As Exception
            Log.LogException(ex, "EmpresaBL.ActualizaDatosFiscales")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al actualizar datos fiscales: " & ex.Message)
            Return False
        Finally
            boolExisteEmpresa = Nothing
            cuentaBL = Nothing
            empresaDal = Nothing
        End Try
    End Function

    Private Function EsValidoParaActualizar(ByRef Empresa As empresaBE, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try
            If (String.IsNullOrWhiteSpace(Empresa.RFC)) Then
                mensaje &= "El RFC de la empresa es obligatorio, no puede ir el campo vacio." & vbCrLf
            Else
                Empresa.RFC = Empresa.RFC.Trim.ToUpper

                Select Case Empresa.RFC.Length
                    Case 12
                        If (Not (csValidaciones.esRFCValidoPersonaMoral(Empresa.RFC))) Then
                            mensaje &= String.Format("RFC <{0}> no válido para Persona Moral", Empresa.RFC) & vbCrLf
                        End If

                    Case 13
                        If (Not (csValidaciones.esRFCValidoPersonaFisica(Empresa.RFC))) Then
                            mensaje &= String.Format("RFC <{0}> no válido para Persona Física", Empresa.RFC) & vbCrLf
                        End If

                    Case Else
                        mensaje &= String.Format("Longitud de RFC no válida (<{0}>)", Empresa.RFC) & vbCrLf
                End Select
            End If

            If (String.IsNullOrWhiteSpace(Empresa.RazonSocial)) Then
                mensaje &= "La Razon Social de la empresa es obligatoria."
            Else
                Empresa.RazonSocial = Empresa.RazonSocial.Trim
                If (Empresa.RazonSocial.Length > 500) Then
                    Empresa.RazonSocial = Empresa.RazonSocial.Substring(0, 500)
                End If
            End If

            If (String.IsNullOrWhiteSpace(Empresa.DF_Calle)) Then
                mensaje &= "La Calle de Domicilio Fiscal de la empresa es obligatoria." & vbCrLf
            Else
                Empresa.DF_Calle = Empresa.DF_Calle.Trim
                If (Empresa.DF_Calle.Length > 255) Then
                    Empresa.DF_Calle = Empresa.DF_Calle.Trim.Substring(0, 255)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Empresa.DF_NumExt)) Then
                Empresa.DF_NumExt = Empresa.DF_NumExt.Trim
                If (Empresa.DF_NumExt.Length > 255) Then
                    Empresa.DF_NumExt = Empresa.DF_NumExt.Trim.Substring(0, 255)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Empresa.DF_NumInt)) Then
                Empresa.DF_NumInt = Empresa.DF_NumInt.Trim
                If (Empresa.DF_NumInt.Length > 255) Then
                    Empresa.DF_NumInt = Empresa.DF_NumInt.Trim.Substring(0, 255)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Empresa.DF_Colonia)) Then
                Empresa.DF_Colonia = Empresa.DF_Colonia.Trim
                If (Empresa.DF_Colonia.Length > 255) Then
                    Empresa.DF_Colonia = Empresa.DF_Colonia.Trim.Substring(0, 255)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Empresa.DF_Localidad)) Then
                Empresa.DF_Localidad = Empresa.DF_Localidad.Trim
                If (Empresa.DF_Localidad.Length > 255) Then
                    Empresa.DF_Localidad = Empresa.DF_Localidad.Trim.Substring(0, 255)
                End If
            End If

            If Not (String.IsNullOrWhiteSpace(Empresa.DF_Referencia)) Then
                Empresa.DF_Referencia = Empresa.DF_Referencia.Trim
                If (Empresa.DF_Referencia.Length > 255) Then
                    Empresa.DF_Referencia = Empresa.DF_Referencia.Trim.Substring(0, 255)
                End If
            End If

            If (String.IsNullOrWhiteSpace(Empresa.DF_Municipio)) Then
                mensaje &= "El Municipio de Domicilio Fiscal de la empresa es obligatorio." & vbCrLf
            Else
                Empresa.DF_Municipio = Empresa.DF_Municipio.Trim
                If (Empresa.DF_Municipio.Length > 255) Then
                    Empresa.DF_Municipio = Empresa.DF_Municipio.Trim.Substring(0, 255)
                End If
            End If

            If (String.IsNullOrWhiteSpace(Empresa.DF_Estado)) Then
                mensaje &= "El Estado de Domicilio Fiscal de la empresa es obligatorio." & vbCrLf
            Else
                Empresa.DF_Estado = Empresa.DF_Estado.Trim
                If (Empresa.DF_Estado.Length > 255) Then
                    Empresa.DF_Estado = Empresa.DF_Estado.Trim.Substring(0, 255)
                End If
            End If

            If (String.IsNullOrWhiteSpace(Empresa.DF_Pais)) Then
                mensaje &= "El País de Domicilio Fiscal de la empresa es obligatorio." & vbCrLf
            Else
                Empresa.DF_Pais = Empresa.DF_Pais.Trim
                If (Empresa.DF_Pais.Length > 255) Then
                    Empresa.DF_Pais = Empresa.DF_Pais.Trim.Substring(0, 255)
                End If
            End If

            If (String.IsNullOrWhiteSpace(Empresa.DF_CP)) Then
                mensaje &= "El Codigo Postal de Domicilio Fiscal de la empresa es obligatorio." & vbCrLf
            Else
                Empresa.DF_CP = Empresa.DF_CP.Trim
                If (Not csValidaciones.esCodigoPostalValido(Empresa.DF_CP)) Then
                    mensaje &= String.Format("Código Postal <{0}> debe ser de 5 dígitos", Empresa.DF_CP) & vbCrLf
                End If
            End If

            If (String.IsNullOrWhiteSpace(Empresa.Correo)) Then
                mensaje &= "El Correo Electrónico de la empresa es obligatorio." & vbCrLf
            Else
                Empresa.Correo = Empresa.Correo.Trim
                If (Empresa.Correo.Length > 255) Then
                    Empresa.Correo = Empresa.Correo.Substring(0, 255)
                End If
                If (Not (csValidaciones.esCorreoValido(Empresa.Correo))) Then
                    mensaje &= String.Format("Dirección de Correo Electrónico <{0}> no válido", Empresa.Correo) & vbCrLf
                End If
            End If

            If (String.IsNullOrWhiteSpace(Empresa.Telefono)) Then
                mensaje &= "El Teléfono es obligatorio" & vbCrLf
            Else
                Empresa.Telefono = Empresa.Telefono.Trim
                If (Empresa.Telefono.Length > 10) Then
                    mensaje &= String.Format("El Teléfono <{0}> debe ser de longitud máxima de 10 números.", Empresa.Telefono) & vbCrLf
                Else
                    If Not (IsNumeric(Empresa.Telefono)) Then
                        mensaje &= String.Format("El Teléfono <{0}> debe ser numérico.", Empresa.Telefono) & vbCrLf
                    End If
                End If
            End If

            If (Not String.IsNullOrWhiteSpace(Empresa.Sector)) Then
                Empresa.Sector = Empresa.Sector.Trim
            End If

            If (Not String.IsNullOrWhiteSpace(Empresa.ClavePemex)) Then
                Empresa.ClavePemex = Empresa.ClavePemex.Trim
            End If

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "EmpresasBL.EsValidoParaActualizar")
            mensaje &= ex.Message
            Return False
        End Try
    End Function

    Public Function GetEmpresa(ByVal tokenConexion As String, ByVal Rfc As String, ByRef detResp As DetalleRespuesta) As empresaBE
        detResp.Mensajes = ""
        Dim boolExisteEmpresa As Boolean = True
        Dim empresaDal As EmpresaDAL = New EmpresaDAL("")
        Dim empresaBe As empresaBE
        Dim cuentaDal As CatCuentasDAL = New CatCuentasDAL()
        Try
            tokenConexion = RijndaelSimple.desencriptaDefault(tokenConexion)
            If (EsValidoParaGetEmpresa(Rfc, detResp.Mensajes)) Then
                empresaDal = New EmpresaDAL(tokenConexion)
                empresaBe = empresaDal.getEmpresa(Rfc)
                If (empresaBe IsNot Nothing) Then
                    If (System.IO.File.Exists(System.IO.Path.Combine(My.Settings.PathFiles, empresaBe.RFC, "logo.jpg"))) Then
                        empresaBe.Logo = csArchivos.leeArchivoEnByteArray(System.IO.Path.Combine(My.Settings.PathFiles, empresaBe.RFC, "logo.jpg"))
                    Else
                        empresaBe.Logo = Nothing
                    End If
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ProcesamientoOK,
                                             "Se obtuvo la información de la empresa con éxito.")
                    Return empresaBe
                Else
                    detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.Catalogo_RegistroInexistenteOInactivo,
                                             "No se pudo obtener la información de la Empresa.")
                    Return Nothing
                End If
            Else
                detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ValoresInvalidos,
                                         "El Rfc proporciona no es correcto: " & vbCrLf & detResp.Mensajes)
                Return Nothing
            End If
        Catch ex As Exception
            Log.LogException(ex, "EmpresaBL.GetEmpresa")
            detResp.estableceValores(DetalleRespuesta.CodigoRespuesta.ExcepcionEnOperacion,
                                     detResp.Mensajes & "Excepción al obtener datos de la empresa: " & ex.Message)
            Return Nothing
        Finally
            empresaDal = Nothing
            boolExisteEmpresa = Nothing
            empresaBe = Nothing
            cuentaDal = Nothing
        End Try
    End Function

    Private Function EsValidoParaGetEmpresa(ByRef Rfc As String, ByRef mensaje As String) As Boolean
        mensaje = ""
        Try
            If (String.IsNullOrWhiteSpace(Rfc)) Then
                mensaje &= "El RFC de la empresa es obligatorio, no puede ir el campo vacio." & vbCrLf
            Else
                Rfc = Rfc.Trim.ToUpper

                Select Case Rfc.Length
                    Case 12
                        If (Not (csValidaciones.esRFCValidoPersonaMoral(Rfc))) Then
                            mensaje &= String.Format("RFC <{0}> no válido para Persona Moral", Rfc) & vbCrLf
                        End If

                    Case 13
                        If (Not (csValidaciones.esRFCValidoPersonaFisica(Rfc))) Then
                            mensaje &= String.Format("RFC <{0}> no válido para Persona Física", Rfc) & vbCrLf
                        End If

                    Case Else
                        mensaje &= String.Format("Longitud de RFC no válida (<{0}>)", Rfc) & vbCrLf
                End Select
            End If

            Return (mensaje = "")
        Catch ex As Exception
            Log.LogException(ex, "EmpresasBL.EsValidoParaGetEmpresa")
            mensaje &= ex.Message
            Return False
        End Try
    End Function

    Public Function getRFCEmpresa(ByVal tokenConexion As String) As String
        If (String.IsNullOrWhiteSpace(tokenConexion)) Then
            Return ""
        End If
        Dim emprDAL As EmpresaDAL = New EmpresaDAL("")
        Try
            emprDAL = New EmpresaDAL(RijndaelSimple.desencriptaDefault(tokenConexion))
            Return emprDAL.getRFCEmpresa()
        Catch ex As Exception
            Log.LogException(ex, "EmpresasBL.getRFCEmpresa")
            Return ""
        Finally
            emprDAL = Nothing
        End Try

    End Function
End Class
